package ar.uade.fain.ai.tpo.controller;

import ar.uade.fain.ai.tpo.dao.CategoriaDAO;
import ar.uade.fain.ai.tpo.dao.ProductoDAO;
import ar.uade.fain.ai.tpo.dao.ProveedorDAO;
import ar.uade.fain.ai.tpo.dao.UnidadDAO;
import ar.uade.fain.ai.tpo.dto.ProductoDTO;
import ar.uade.fain.ai.tpo.model.Categoria;
import ar.uade.fain.ai.tpo.model.Producto;
import ar.uade.fain.ai.tpo.model.Proveedor;
import ar.uade.fain.ai.tpo.model.Unidad;

public class AdministracionProductoControlador implements Controlador {

	private ProductoDAO productoDAO;
	private CategoriaDAO categoriaDAO;
	private UnidadDAO unidadDAO;
	private ProveedorDAO proveedorDAO;

	public AdministracionProductoControlador() {
		super();
	}

	public ProductoDAO getProductoDAO() {
		return productoDAO;
	}

	public void setProductoDAO(ProductoDAO productoDAO) {
		this.productoDAO = productoDAO;
	}

	public CategoriaDAO getCategoriaDAO() {
		return categoriaDAO;
	}

	public void setCategoriaDAO(CategoriaDAO categoriaDAO) {
		this.categoriaDAO = categoriaDAO;
	}

	public UnidadDAO getUnidadDAO() {
		return unidadDAO;
	}

	public void setUnidadDAO(UnidadDAO unidadDAO) {
		this.unidadDAO = unidadDAO;
	}

	public ProveedorDAO getProveedorDAO() {
		return proveedorDAO;
	}

	public void setProveedorDAO(ProveedorDAO proveedorDAO) {
		this.proveedorDAO = proveedorDAO;
	}

	@Override
	public void init() {
	}

	@Override
	public void destroy() {
	}

	public void altaProducto(ProductoDTO productoDTO) {
		if (getProductoDAO().buscarPorNombre(productoDTO.getNombre()) == null) {
			Producto producto = crearProducto(productoDTO);
			getProductoDAO().guardar(producto);
			System.out.println("producto agregado con exito");
		} else {
			throw new IllegalArgumentException("El producto ya existe");
		}
	}

	public void bajaProducto(Long id) {
		Producto producto = getProductoDAO().buscarPorId(id);
		if (producto != null) {
			getProductoDAO().eliminar(id);
			System.out.println("producto eliminado con exito");
		} else {
			System.out.println("producto no existe");
		}
	}

	public ProductoDTO buscarProducto(Long id){
		final Producto producto = getProductoDAO().buscarPorId(id);
		return map(producto);
	}

	private ProductoDTO map(Producto producto) {
		final ProductoDTO productoDTO = new ProductoDTO();
		if (producto == null){
			return null;
		}
		else{
			productoDTO.setCosto(producto.getCosto());
			productoDTO.setEstacionDesde(producto.getEstacionDesde());
			productoDTO.setEstacionHasta(producto.getEstacionHasta());
			productoDTO.setId(producto.getId());
			productoDTO.setIdCategoria(producto.getCategoria().getId());
			productoDTO.setIdProveedor(producto.getProveedor().getId());
			productoDTO.setIdUnidad(producto.getUnidad().getId());
			productoDTO.setNombre(producto.getNombre());
			return productoDTO;
		}
	}

	public void modificarProducto(ProductoDTO productoDTO) {
		Producto producto = getProductoDAO().buscarPorId(productoDTO.getId());
		if(producto !=null){
			producto.setCategoria(getCategoriaDAO().buscarPorId(productoDTO.getIdCategoria()));
			producto.setProveedor(getProveedorDAO().buscarPorId(productoDTO.getIdProveedor()));
			producto.setUnidad(getUnidadDAO().buscarPorId(productoDTO.getIdCategoria()));
			producto.setCosto(productoDTO.getCosto());
			producto.setEstacionDesde(productoDTO.getEstacionDesde());
			producto.setEstacionHasta(productoDTO.getEstacionHasta());
			producto.setNombre(productoDTO.getNombre());
			getProductoDAO().modificar(producto);
			System.out.println("producto modificado con exito");
		}else{
			System.err.println("producto no existe");
		}
	}

	private Producto crearProducto(ProductoDTO productoDTO) {
		Categoria ca = getCategoriaDAO().buscarPorId(productoDTO.getIdCategoria());
		Unidad u = getUnidadDAO().buscarPorId(productoDTO.getIdUnidad());
		Proveedor p = getProveedorDAO().buscarPorId(productoDTO.getIdProveedor());
		Producto producto = new Producto(productoDTO.getId(),
				productoDTO.getNombre(), productoDTO.getCosto(),
				productoDTO.getEstacionDesde(), productoDTO.getEstacionHasta(),
				ca, u, p);
		return producto;
	}

}
